<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>Npm Dependents - ECHARTS-GL</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
    <meta name="apple-mobile-web-app-capable" content="yes"> <!-- Fullscreen Landscape on iOS -->
    <link rel="stylesheet" href="./common.css">
</head>
<body>
<div id="main"></div>
<div id="toolbar">
    <button id="stop-layout">Stop layout</button>
    <button id="start-layout">Start alyout</button>
</div>
<script src="../node_modules/echarts/dist/echarts.js"></script>
<script src="lib/echarts-graph-modularity.js"></script>
<script src="../dist/echarts-gl.js"></script>
<script src="lib/jquery.min.js"></script>
<script src="js/commonUI.js"></script>
<script>
    var chart = echarts.init(document.getElementById('main'), null, {
        devicePixelRatio: 1
    });

    $.getJSON('data/npmdep.json', function (data) {
        var nodes = data.nodes.map(function (nodeName, idx) {
            return {
                name: nodeName,
                value: data.dependentsCount[idx]
            }
        });
        var edges = [];
        for (var i = 0; i < data.edges.length;) {
            var s = data.edges[i++];
            var t = data.edges[i++];
            edges.push({
                source: s,
                target: t
            });
        }

        nodes.forEach(function (node) {
            if (node.value > 100) {
                node.emphasis = {
                    label: {
                        show: true
                    }
                }
            }
            if (node.value > 5000) {
                node.label = {
                    show: true
                }
            }
        });

        chart.setOption({
            series: [{
                color: ["rgb(203,239,15)", "rgb(73,15,239)", "rgb(15,217,239)", "rgb(30,15,239)", "rgb(15,174,239)", "rgb(116,239,15)", "rgb(239,15,58)", "rgb(15,239,174)", "rgb(239,102,15)", "rgb(239,15,15)", "rgb(15,44,239)", "rgb(239,145,15)", "rgb(30,239,15)", "rgb(239,188,15)", "rgb(159,239,15)", "rgb(159,15,239)", "rgb(15,239,44)", "rgb(15,239,87)", "rgb(15,239,217)", "rgb(203,15,239)", "rgb(239,15,188)", "rgb(239,15,102)", "rgb(239,58,15)", "rgb(239,15,145)", "rgb(116,15,239)", "rgb(15,131,239)", "rgb(73,239,15)", "rgb(15,239,131)", "rgb(15,87,239)", "rgb(239,15,231)"],
                type: 'graphGL',
                nodes: nodes,
                edges: edges,
                modularity: {
                    resolution: 2,
                    sort: true
                },
                lineStyle: {
                    color: 'rgba(255,255,255,1)',
                    opacity: 0.05,
                    width: 1
                },
                itemStyle: {
                    opacity: 1,
                    // borderColor: '#fff',
                    // borderWidth: 1
                },
                focusNodeAdjacencyOn: 'click',
                symbolSize: function (value) {
                    return Math.sqrt(value / 10);
                },
                label: {
                    textStyle: {
                        color: '#fff'
                    }
                },
                emphasis: {
                    label: {
                        show: false
                    },
                    lineStyle: {
                        opacity: 0.5,
                        width: 1
                    }
                },
                forceAtlas2: {
                    steps: 5,
                    maxSteps: 3000,
                    jitterTolerence: 10,
                    edgeWeight: [0.2, 1],
                    gravity: 5,
                    edgeWeightInfluence: 0,
                    // preventOverlap: true
                }
            }]
        });

        $('#start-layout').click(function () {
            chart.dispatchAction({
                type: 'graphGLStartLayout'
            });
        });

        $('#stop-layout').click(function () {
            chart.dispatchAction({
                type: 'graphGLStopLayout'
            });
        });

        window.onresize = chart.resize;
    });

</script>
</body>
</html>
